{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Importar parámetros web\n", "\n", "## Librería\n", "\n", "Para empezar, la guía se realizará en base al problema de Family Knapsack que se introdujo como ejemplo en la guía *Matemáticas en MS Office*. El primer paso es importar las librerías **pandas** y **requests** con las siguientes líneas de código:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import requests as rq" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Motivación\n", "\n", "Resulta conveniente publicar los datos de los que depende la ejecución de nuestro código como contenido web de acceso remoto. De esta forma podemos estar seguros de que la ejecución del código será consistente entre usuarios y nos permite desempeñar control de versionamiento sobre los datos, no solo el código.\n", "\n", "## Tablas en HTML\n", "\n", "Lo siguiente es importar la tablas en formato *HTML* donde se encuentran los parámetros del problema de optimización a resolver. En este caso, podemos ver las tablas en el siguiente [enlace](https://copa-uniandes.github.io/Family-Knapsack-Model-Parameters-Web/). El contenido de la página, según su código HTML, lo solicitamos con la función *get().content* y lo guardamos en la variable *HTML*." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "url = 'https://copa-uniandes.github.io/Family-Knapsack-Model-Parameters-Web/'\n", "html = rq.get(url).content" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora que tenemos el código de la página, le pedimos a **pandas** que haga una lectura e identifique las posibles tablas embemidas en la página con la función *pd.read_html()*." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "df_list = pd.read_html(html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La variable *df_list* contiene una lista de todas las tablas en el documento HTML. Extraemos cada tabla de la lista y la guardamos en sus respectivas variables. Note que estas tablas son *data frames* de **pandas**." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "preferencia_df = df_list[0]\n", "peso_df = df_list[1]\n", "capacidad_df = df_list[2]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PreferenciaPapáMamáHijoHija
0Botella de agua82118
1Carpa2954
2Lata de atún61273
3Botiquín124612
4Protector solar111127
5Lata de salchichas710106
6Bolsa de dormir37310
7Linterna10822
8Repelente9399
9Brújula5511
10Cobija411411
11Balón1685
\n", "
" ], "text/plain": [ " Preferencia Papá Mamá Hijo Hija\n", "0 Botella de agua 8 2 11 8\n", "1 Carpa 2 9 5 4\n", "2 Lata de atún 6 12 7 3\n", "3 Botiquín 12 4 6 12\n", "4 Protector solar 11 1 12 7\n", "5 Lata de salchichas 7 10 10 6\n", "6 Bolsa de dormir 3 7 3 10\n", "7 Linterna 10 8 2 2\n", "8 Repelente 9 3 9 9\n", "9 Brújula 5 5 1 1\n", "10 Cobija 4 11 4 11\n", "11 Balón 1 6 8 5" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preferencia_df" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ObjetoPeso
0Botella de agua2
1Carpa8
2Lata de atún2
3Botiquín2
4Protector solar1
5Lata de salchichas2
6Bolsa de dormir4
7Linterna3
8Repelente2
9Brújula1
10Cobija6
11Balón3
\n", "
" ], "text/plain": [ " Objeto Peso\n", "0 Botella de agua 2\n", "1 Carpa 8\n", "2 Lata de atún 2\n", "3 Botiquín 2\n", "4 Protector solar 1\n", "5 Lata de salchichas 2\n", "6 Bolsa de dormir 4\n", "7 Linterna 3\n", "8 Repelente 2\n", "9 Brújula 1\n", "10 Cobija 6\n", "11 Balón 3" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "peso_df" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ExcursionistaCapacidad
0Papá12
1Mamá12
2Hijo6
3Hija6
\n", "
" ], "text/plain": [ " Excursionista Capacidad\n", "0 Papá 12\n", "1 Mamá 12\n", "2 Hijo 6\n", "3 Hija 6" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "capacidad_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Parámetros\n", "\n", "Con lo anterior, se procede a guardar los parámetros en diccionarios. Para cada parámetro se debe seguir el siguiente procedimiento:\n", "\n", "1. Crear el diccionario donde se guardará su información.\n", "2. Realizar uno o dos recorridos para pasar por los valores de cada uno de los índices del parámetro.\n", "3. Dentro del recorrido se guarda el valor del índice en el diccionario donde los índices serán las llaves.\n", "4. Dado el índice, se le asigna un valor dentro del diccionario.\n", "\n", "En la primera tabla se encuentra el parámetro $q_{i,j}$ que hace referencia a la preferencia de cada integrante de la familia por cada uno de los objetos.\n", "\n", "Como este parámetro esta indexado en el conjunto de integrantes y en el conjunto de objetos, debemos realizar un doble recorrido.\n", "\n", "````{margin}\n", "```{admonition} Nota\n", ":class: dropdown\n", " \n", "Es importante identificar que en **pandas** los *data frame* pueden llamarse de forma indexada sobre las columnas con \"[]\". El resultado es una *serie* ue luego puede llamarse de forma indexada igual que una lista con \"[]\".\n", "\n", "````" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{('Botella de agua', 'Papá'): 8,\n", " ('Botella de agua', 'Mamá'): 2,\n", " ('Botella de agua', 'Hijo'): 11,\n", " ('Botella de agua', 'Hija'): 8,\n", " ('Carpa', 'Papá'): 2,\n", " ('Carpa', 'Mamá'): 9,\n", " ('Carpa', 'Hijo'): 5,\n", " ('Carpa', 'Hija'): 4,\n", " ('Lata de atún', 'Papá'): 6,\n", " ('Lata de atún', 'Mamá'): 12,\n", " ('Lata de atún', 'Hijo'): 7,\n", " ('Lata de atún', 'Hija'): 3,\n", " ('Botiquín', 'Papá'): 12,\n", " ('Botiquín', 'Mamá'): 4,\n", " ('Botiquín', 'Hijo'): 6,\n", " ('Botiquín', 'Hija'): 12,\n", " ('Protector solar', 'Papá'): 11,\n", " ('Protector solar', 'Mamá'): 1,\n", " ('Protector solar', 'Hijo'): 12,\n", " ('Protector solar', 'Hija'): 7,\n", " ('Lata de salchichas', 'Papá'): 7,\n", " ('Lata de salchichas', 'Mamá'): 10,\n", " ('Lata de salchichas', 'Hijo'): 10,\n", " ('Lata de salchichas', 'Hija'): 6,\n", " ('Bolsa de dormir', 'Papá'): 3,\n", " ('Bolsa de dormir', 'Mamá'): 7,\n", " ('Bolsa de dormir', 'Hijo'): 3,\n", " ('Bolsa de dormir', 'Hija'): 10,\n", " ('Linterna', 'Papá'): 10,\n", " ('Linterna', 'Mamá'): 8,\n", " ('Linterna', 'Hijo'): 2,\n", " ('Linterna', 'Hija'): 2,\n", " ('Repelente', 'Papá'): 9,\n", " ('Repelente', 'Mamá'): 3,\n", " ('Repelente', 'Hijo'): 9,\n", " ('Repelente', 'Hija'): 9,\n", " ('Brújula', 'Papá'): 5,\n", " ('Brújula', 'Mamá'): 5,\n", " ('Brújula', 'Hijo'): 1,\n", " ('Brújula', 'Hija'): 1,\n", " ('Cobija', 'Papá'): 4,\n", " ('Cobija', 'Mamá'): 11,\n", " ('Cobija', 'Hijo'): 4,\n", " ('Cobija', 'Hija'): 11,\n", " ('Balón', 'Papá'): 1,\n", " ('Balón', 'Mamá'): 6,\n", " ('Balón', 'Hijo'): 8,\n", " ('Balón', 'Hija'): 5}" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = {(preferencia_df[\"Preferencia\"][i], j): preferencia_df[j][i]\n", " for i in range(len(preferencia_df[\"Preferencia\"]))\n", " for j in preferencia_df.columns[1:] }\n", "q" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Realizamos el mismo procedimiento para las otras dos tablas ($p_i$ y $b_j$)." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Botella de agua': 2,\n", " 'Carpa': 8,\n", " 'Lata de atún': 2,\n", " 'Botiquín': 2,\n", " 'Protector solar': 1,\n", " 'Lata de salchichas': 2,\n", " 'Bolsa de dormir': 4,\n", " 'Linterna': 3,\n", " 'Repelente': 2,\n", " 'Brújula': 1,\n", " 'Cobija': 6,\n", " 'Balón': 3}" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = {peso_df[\"Objeto\"][i]: peso_df[\"Peso\"][i]\n", " for i in range(len(peso_df[\"Objeto\"]))}\n", "p" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Papá': 12, 'Mamá': 12, 'Hijo': 6, 'Hija': 6}" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = {capacidad_df[\"Excursionista\"][j]: capacidad_df[\"Capacidad\"][j]\n", " for j in range(len(capacidad_df[\"Excursionista\"]))}\n", "b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conjuntos\n", "\n", "Finalmente, se construyen los conjuntos a partir de las llaves de los diccionarios que ya se crearon para los parámetros. Como el parametro $p_i$ esta indexado en el conjunto de objetos, éste tiene como llaves a todos los objetos. Por lo tanto, el conjunto de objetos, que se declarará como una lista, se construye con la siguiente línea de código:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Botella de agua',\n", " 'Carpa',\n", " 'Lata de atún',\n", " 'Botiquín',\n", " 'Protector solar',\n", " 'Lata de salchichas',\n", " 'Bolsa de dormir',\n", " 'Linterna',\n", " 'Repelente',\n", " 'Brújula',\n", " 'Cobija',\n", " 'Balón']" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "O = list(p.keys())\n", "\n", "# Se imprime la lista para verificar que se haya construido correctamente el conjunto\n", "O" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lo mismo para construir el conjunto de excursionistas, pero en este caso a partir del parametro $b_j$ ya que este está indexado en el conjunto deseado." ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Papá', 'Mamá', 'Hijo', 'Hija']" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E = list(b.keys())\n", "\n", "# Se imprime la lista para verificar que se haya construido correctamente el conjunto\n", "E" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Siguiente paso\n", "\n", "Con los parámetros importados y los conjuntos construidos se puede proceder a la implementación y solución del problema de optimización." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Créditos\n", "\n", "Equipo de Optimización
\n", "Desarrollo: Alejandro Mantilla
\n", "Fecha: 25/04/2021
" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }